/*

 * Roboviz.cpp
 *
 *  Created on: Aug 17, 2011
 *      Author: adailton



#include "../include/Roboviz.h"
#include <cstring>
#include <cstdio>

Roboviz *Roboviz::mInstance = NULL;

Roboviz::Roboviz()
{
}

static
Roboviz&
Roboviz::getInstance()
{
	if (mInstance == NULL)
	{
		mInstance = new Roboviz();
	}
    return *mInstance;
}

void
Roboviz::ativo(bool ativo)
{
    isAtivo = ativo;
}

void
Roboviz::setNumeroJogador(int num)
{
    mNumeroJogador = num;
}

void
Roboviz::conectar(std::string host, std::string port)
{
    if(isAtivo)
    {
        mConexao = new ConexaoUDP(host, port);
    }
}

void
Roboviz::swap()
{
    if(!isAtivo) return;

    std::string nome = "L" + convert_to<std::string>(mNumeroJogador) + ".";
    int bufSize = -1;

    bufSize = 3 + nome.length();
    unsigned char* buf = new unsigned char[bufSize];

    long i = 0;
    i += writeCharToBuf(buf+i, 0);
    i += writeCharToBuf(buf+i, 0);
    i += writeStringToBuf(buf+i, &nome);

    std::string msg(reinterpret_cast<char*>(buf),bufSize);
    mConexao->enviarMensagem(msg);
}

void
Roboviz::drawEsfera(Coordenada3d centro, float raio, RobovizCor cor, std::string nome)
{

    if(!isAtivo) return;

    const float p[3] = {centro.X(), centro.Y(), centro.Z()};

    const float color[3] = {cor.r, cor.g, cor.b};


    nome = "L" + convert_to<std::string>(mNumeroJogador) + "." + nome;


    int bufSize = 30 + nome.length();

    unsigned char* buf = new unsigned char[bufSize];


    long i = 0;
    i += writeCharToBuf(buf+i, 1);
    i += writeCharToBuf(buf+i, 3);
    i += writeFloatToBuf(buf+i, p[0]);
    i += writeFloatToBuf(buf+i, p[1]);
    i += writeFloatToBuf(buf+i, p[2]);
    i += writeFloatToBuf(buf+i, raio);
    i += writeColorToBuf(buf+i, color, 3);
    i += writeStringToBuf(buf+i, &nome);

    char* buffer = reinterpret_cast<char*>(buf);

    std::string msg(buffer,bufSize);

    mConexao->enviarMensagem(msg);

}

void
Roboviz::drawCirculo(Coordenada2d centro, float raio, float espessura, RobovizCor cor, std::string nome)
{
    if(!isAtivo) return;

    const float p[2] = {centro.X(), centro.Y()};
    const float color[3] = {cor.r, cor.g, cor.b};

    nome = "L" + convert_to<std::string>(mNumeroJogador) + "." + nome;

    int bufSize = 30 + nome.length();
    unsigned char* buf = new unsigned char[bufSize];

    long i = 0;
    i += writeCharToBuf(buf+i, 1);
    i += writeCharToBuf(buf+i, 0);
    i += writeFloatToBuf(buf+i, p[0]);
    i += writeFloatToBuf(buf+i, p[1]);
    i += writeFloatToBuf(buf+i, raio);
    i += writeFloatToBuf(buf+i, espessura);
    i += writeColorToBuf(buf+i, color, 3);
    i += writeStringToBuf(buf+i, &nome);

    char* buffer = reinterpret_cast<char*>(buf);

    std::string msg(buffer,bufSize);
    mConexao->enviarMensagem(msg);
}

void
Roboviz::drawLinha(Coordenada3d inicio, Coordenada3d fim, float espessura, RobovizCor cor, std::string nome)
{
    if(!isAtivo) return;

    const float a[3] = {inicio.X(), inicio.Y(), inicio.Z()};
    const float b[3] = {fim.X(), fim.Y(), fim.Z()};

    const float color[3] = {cor.r, cor.g, cor.b};

    nome = "L" + convert_to<std::string>(mNumeroJogador) + "." + nome;

    int bufSize = 48 + nome.length();
    unsigned char* buf = new unsigned char[bufSize];

    long i = 0;
    i += writeCharToBuf(buf+i, 1);
    i += writeCharToBuf(buf+i, 1);
    i += writeFloatToBuf(buf+i, a[0]);
    i += writeFloatToBuf(buf+i, a[1]);
    i += writeFloatToBuf(buf+i, a[2]);
    i += writeFloatToBuf(buf+i, b[0]);
    i += writeFloatToBuf(buf+i, b[1]);
    i += writeFloatToBuf(buf+i, b[2]);
    i += writeFloatToBuf(buf+i, espessura);
    i += writeColorToBuf(buf+i, color, 3);
    i += writeStringToBuf(buf+i, &nome);

    char* buffer = reinterpret_cast<char*>(buf);

    std::string msg(buffer,bufSize);
    mConexao->enviarMensagem(msg);
}

void
Roboviz::drawPonto(Coordenada3d ponto, float tamanho, RobovizCor cor, std::string nome)
{
    if(!isAtivo) return;

    const float p[3] = {ponto.X(), ponto.Y(), ponto.Z()};

    const float color[3] = {cor.r, cor.g, cor.b};

    nome = "L" + convert_to<std::string>(mNumeroJogador) + "." + nome;

    int bufSize = 30 + nome.length();
    unsigned char* buf = new unsigned char[bufSize];

    long i = 0;
    i += writeCharToBuf(buf+i, 1);
    i += writeCharToBuf(buf+i, 2);
    i += writeFloatToBuf(buf+i, p[0]);
    i += writeFloatToBuf(buf+i, p[1]);
    i += writeFloatToBuf(buf+i, p[2]);
    i += writeFloatToBuf(buf+i, tamanho);
    i += writeColorToBuf(buf+i, color, 3);
    i += writeStringToBuf(buf+i, &nome);

    char* buffer = reinterpret_cast<char*>(buf);

    std::string msg(buffer,bufSize);
    mConexao->enviarMensagem(msg);
}

void
Roboviz::drawPoligono(std::vector<Coordenada3d> vertice, RobovizCor cor, std::string nome)
{
    if(!isAtivo) return;

    const float color[4] = {cor.r, cor.g, cor.b, 127.5};
    int numVerts = convert_to<int>(vertice.size());

    nome = "L" + convert_to<std::string>(mNumeroJogador) + "." + nome;

    float v[numVerts*3];
    int indice = 0;

    for (std::vector<Coordenada3d>::iterator it = vertice.begin(); it != vertice.end(); ++it)
    {
        v[indice*3+0] = convert_to<float>(it->X());
        v[indice*3+1] = convert_to<float>(it->Y());
        v[indice*3+2] = convert_to<float>(it->Z());
        indice++;
    }

    int bufSize = 18 * numVerts + 8 + nome.length();
    unsigned char* buf = new unsigned char[bufSize];

    long i = 0;
    i += writeCharToBuf(buf+i, 1);
    i += writeCharToBuf(buf+i, 4);
    i += writeCharToBuf(buf+i, numVerts);
    i += writeColorToBuf(buf+i, color, 4);

    for (int j = 0; j < numVerts; j++)
    {
        std::cout << "Ponto " << j << ": " << v[j*3+0] << " " << v[j*3+1] << " " << v[j*3+2] << std::endl;
        i += writeFloatToBuf(buf+i, v[j*3+0]);
        i += writeFloatToBuf(buf+i, v[j*3+1]);
        i += writeFloatToBuf(buf+i, v[j*3+2]);
    }

    i += writeStringToBuf(buf+i, &nome);

    char* buffer = reinterpret_cast<char*>(buf);

    std::string msg(buffer,bufSize);
    mConexao->enviarMensagem(msg);
}


void
Roboviz::drawAnotacao(std::string texto, Coordenada3d ponto, RobovizCor cor, std::string nome)
{
    if(!isAtivo) return;

    const float p[3] = {ponto.X(), ponto.Y(), ponto.Z()};

    const float color[3] = {cor.r, cor.g, cor.b};

    nome = "L" + convert_to<std::string>(mNumeroJogador) + "." + nome;

    int bufSize = 25 + texto.length() + nome.length();
    unsigned char* buf = new unsigned char[bufSize];

    long i = 0;
    i += writeCharToBuf(buf+i, 2);
    i += writeCharToBuf(buf+i, 0);
    i += writeFloatToBuf(buf+i, p[0]);
    i += writeFloatToBuf(buf+i, p[1]);
    i += writeFloatToBuf(buf+i, p[2]);
    i += writeColorToBuf(buf+i, color, 3);
    i += writeStringToBuf(buf+i, &texto);
    i += writeStringToBuf(buf+i, &nome);

    char* buffer = reinterpret_cast<char*>(buf);

    std::string msg(buffer,bufSize);
    mConexao->enviarMensagem(msg);
}

void
Roboviz::drawAgenteAnotacao(std::string texto, bool leftTime, int numAgente, RobovizCor cor)
{
    if(!isAtivo) return;

    const float color[3] = {cor.r, cor.g, cor.b};

    int bufSize = 7 + texto.length();
    unsigned char* buf = new unsigned char[bufSize];

    long i = 0;
    i += writeCharToBuf(buf+i, 2);
    i += writeCharToBuf(buf+i, 1);
    i += writeCharToBuf(buf+i, (leftTime ? numAgente - 1 : numAgente + 127));
    i += writeColorToBuf(buf+i, color, 3);
    i += writeStringToBuf(buf+i, &texto);

    char* buffer = reinterpret_cast<char*>(buf);

    std::string msg(buffer,bufSize);
    mConexao->enviarMensagem(msg);
}


int
Roboviz::writeCharToBuf(unsigned char* buf, unsigned char value)
{
  *buf = value;
  return 1;
}

int
Roboviz::writeFloatToBuf(unsigned char* buf, float value)
{
  char temp[20];
  sprintf(temp, "%6f", value);
  memcpy(buf, temp, 6);
  return 6;
}

int
Roboviz::writeColorToBuf(unsigned char* buf, const float* color, int channels)
{
  int i;
  for (i = 0; i < channels; i++)
    writeCharToBuf(buf+i, (unsigned char)(color[i]));
  return i;
}

int
Roboviz::writeStringToBuf(unsigned char* buf, const std::string* text)
{
  long i = 0;
  if (text != NULL)
    i += text->copy((char*)buf+i, text->length(), 0);
  i += writeCharToBuf(buf+i, 0);
  return i;
}


*/
